package docker

//docker data volume 容器数据卷

//文档： https://docs.docker.com/engine/reference/commandline/volume_create/
//		https://www.bookstack.cn/read/docker_practice-1.3.0/data_management-volume.md


/*
docker是把应用和环境都打包成一个镜像。数据如果在容器中，那么删除容器，数据就会丢失。
mysql容器，容器删了，就相当于删库跑路了。



-------数据可以持久化-------
容器之间可以有一个数据共享的技术，docker容器里面产生的数据，同步到本地。容器删了，但数据还在本地。这就是卷技术

实现：目录的挂载，将容器内的目录挂载到linux上，一旦容器内部产生了数据，会自动同步到linux上

卷的技术，就是实现容器的持久化和同步操作
容器间的数据也是可以共享的。

映射 -- 容器内的数据备份 + 持久化到本地的主机目录

------------注意--------------
数据卷 的使用，类似于 Linux 下对目录或文件进行 mount，镜像中的被指定为挂载点的目录中的文件会复制到数据卷中（仅数据卷为空时会复制）。


------------命令 ------------
	docker volume [ls] --help
			Commands:
			  create      Create a volume	创建一个卷
			  inspect     Display detailed information on one or more volumes  查看卷是如何生成的
			  ls          List volumes   查看当前所有的卷
			  prune       Remove all unused local volumes
			  rm          Remove one or more volumes  删除卷



------------命令 -v ------------

	-v /tmp/home:/home:ro   //ro rw 改变容器内部的读写权限
					ro  //read only 只读		//挂载出来后，只能在外部进行更改，容器内部不允许操作
					rw  //read write 读写
					//一旦设置了容器权限，容器对我们挂载出来的内容就有限制了，ro，挂载出来后，容器内部就不能在对这个文件进行操作，只能从外部改变

		--privileged=true  //一定加


	docker run -it  --privileged=true  -v 主机目录:容器内目录  [和-p端口映射一样] 镜像名 /bin/bash

	docker run -it  --privileged=true -v /tmp/home:/home  centos /bin/bash

	//实例看doc/docker文档，有操作实例
	双向同步，但绑定映射关系后，容器中新增的文件会投影到宿主机中，同理，宿主机中新增的文件也会投影到容器中
	主机目录:容器内目录 映射完毕后，两个地址其实是[同一个地址]，都在主机上。

	双向绑定后，当容器被停止后，宿主机的/tmp/home的文件被编辑或新增等操作

	重启容器 先用docker ps -a 查看刚才关闭的容器id
	docker start 容器id
	会自动把宿主机的内容同步到容器中，数据是同步的
	再次使用 docker exec -it 容器id /bin/bash  | docker attach 容器id启动后
	进入容器查看


	docker ps
	docker inspect  容器名

    .......
	"Mounts":[							//挂载 -v 卷
		{
			"Type":"bind",				//bind  绑定
			"Source":"/home/volume"		//Source 目的地  主机内的路径地址
			"Destination":"/home",		//Destination 发送  docker容器内的地址
			"Mode":"",
			"RW":"true",
			"Propagation":"rprivate"
		}
	],
	......



	exit

	docker ps -a
	docker start 容器id
	docker attach 容器id

	好处，以后只需要在宿主机本地修改即可，容器会自动同步

	docker run -d -it -p 39001:3306 -v /tmp/mysql/conf:/etc/mysql/conf.d -v /tmp/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql
	//去https://hub.docker.com/ 官方搜mysql，查看官方文档

	//https://blog.csdn.net/Madness_stone/article/details/124513179



	docker run -it --privileged=true -d  --name mysql-volume -p 9501:3306 \
    -v /home/zydh/etc/docker-container-etc/mysql/conf:/etc/mysql/conf.d \
	-v /home/zydh/docker/volume/mysql/data:/var/lib/mysql \
	-v /home/zydh/logs/mysql:/var/log/mysql	 \
	-e MYSQL_ROOT_PASSWORD=root \
	mysql  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \



	//注释
	//docker运行 -it 交互模式 --privileged=true 扩大容器的权限，解决挂载目录的权限问题 id后台  --name改名	-p端口映射
	docker run -it --privileged=true  -d  --name mysql-volume -p 9033:3306 \
	// 主机目录：容器目录  配置文件
	-v /home/zydh/etc/docker-container-etc/mysql/conf:/etc/mysql/conf.d   \
	// 主机目录：容器目录  数据
	-v /home/zydh/docker/volume/mysql/data:/var/lib/mysql \
	//-e env环境配置，mysql的密码
	-e MYSQL_ROOT_PASSWORD=root \
	// 启动mysql		--字符集utf8mb4       校准集  utf8mb4_unicode_ci
	mysql  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci


	启动成功后，在本地使用mysql工具链接测试，成功

	看图  images/020docker容器数据卷.png


---------------注意-----------------
	docker挂载主机目录访问如果出现 cannot open directory:Permission denied
	解决方法 ：在挂载目录后多加一个 --privileged=true 参数即可

	如果是CentOS7安全模块会比之前系统版本加强，不安全的会先禁止，所以目录挂载的情况被默认为不安全的行为，
	在SELinux里面挂载目录被禁止掉了额，如果要开启，我们一般使用--privileged=true命令，扩大容器的权限解决挂载目录没有权限的问题，也即使用该参数，container内的root拥有真正的root权限，否则，container内的root只是外部的一个普通用户权限。


*/


